﻿using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Biciq.Datos;
using System.Collections.Generic;
using System.Linq;

namespace Biciq.Silverlight.UI
{   
    public class TagsVistaModelo:VistaModeloBase
    {
         #region campos
        /// <summary>
        /// Metodos gestionadores para Tags del Sistema.
        /// </summary>
        private RelayCommand _comandoBuscarAsignados;
        private RelayCommand _comandoBuscarDisponibles;
        private RelayCommand _comandoBuscarEliminados;
        /// <summary>
        /// Comando para el ingreso de un nuevo tags.
        /// </summary>
        private RelayCommand _comandoAbrirNuevo;
        private EditarTarjetaVistaModelo _editarTarjetaVistaModelo;
        private EditarTarjetaVista _editarTarjetaVista;
        private Tarjeta _TarjetaActual;
      
        private Tarjeta _TarjetaItem;
       
        private Usuario _usuarioLogueado;
     
        private List<Tarjeta> _listaTarjeta;

        private List<Tarjeta> _listaTemporal;

        public List<Tarjeta> ListaTemporal
        {
            get { return _listaTemporal; }
            set { _listaTemporal = value; }
        }
        /// <summary>
        /// Texto de Busqueda.
        /// </summary>
        private String _busqueda;
        private RelayCommand _comandoBuscar;
        private bool _mostrarErrores;

        private BajaTarjetaVista _bajaTarjetaVista;
        private BajaTarjetaVistaModelo _bajaTarjetaVistaModelo;

        private string _numeroDisponibles;

      
        private string  _numeroASIGNADOs;

        
        private string _numeroELIMINADOs;

        public string NumeroEliminados
        {
            get { return _numeroELIMINADOs; }
            set 
            {
                _numeroELIMINADOs = value;
                RaisePropertyChanged("NumeroEliminados");
            }
        }
        /// <summary>
        /// Texto que representa el estado Asignado
        /// </summary>
        public string NumeroAsignados
        {
            get { return _numeroASIGNADOs; }
            set 
            {
                _numeroASIGNADOs = value;
                RaisePropertyChanged("NumeroAsignados");
            }
        }
        /// <summary>
        /// Texto del estado Disponible
        /// </summary>
        public string NumeroDisponibles
        {
            get { return _numeroDisponibles; }
            set 
            {
                _numeroDisponibles = value;
                RaisePropertyChanged("NumeroDisponibles");
            }
        }
        #endregion

        #region constructores
        /// <summary>
        /// Metodo que muetra la vista de los tags.
        /// </summary>
        public TagsVistaModelo()
        {
            MostrarErrores = Visibility.Collapsed;
            InicializarMensajesError();
            this.EsInicio = true;
            Buscar();
        }


        #endregion

        #region metodos Publicos

        #endregion

        #region propiedades
        /// <summary>
        /// Comando buscador por estado Asignados.
        /// </summary>
        public RelayCommand ComandoBuscarAsignados
        {
            get
            {
                if (_comandoBuscarAsignados == null)
                {
                    _comandoBuscarAsignados = new RelayCommand
                    (
                        p => BuscarAsignados()
                    );
                }
                return _comandoBuscarAsignados;
            }
        }
        /// <summary>
        /// Comando buscador por estado Disponible.
        /// </summary>
        public RelayCommand ComandoBuscarDisponibles
        {
            get
            {
                if (_comandoBuscarDisponibles == null)
                {
                    _comandoBuscarDisponibles = new RelayCommand
                    (
                        p => BuscarDisponibles()
                    );
                }
                return _comandoBuscarDisponibles;
            }
        }
        /// <summary>
        /// Comando buscador por Eliminados.
        /// </summary>
        public RelayCommand ComandoBuscarEliminados
        {
            get
            {
                if (_comandoBuscarEliminados == null)
                {
                    _comandoBuscarEliminados = new RelayCommand
                    (
                        p => BuscarEliminados()
                    );
                }
                return _comandoBuscarEliminados;
            }
        }

        /// <summary>
        /// Comando que se dispara al dar click en el botón buscar
        /// </summary>
        public RelayCommand ComandoBuscar
        {
            get
            {
                if (_comandoBuscar == null)
                {
                    _comandoBuscar = new RelayCommand
                    (

                          p => Buscar()
                    );
                }
                return _comandoBuscar;
            }
        }

        /// <summary>
        /// Criterio de Búsqueda
        /// </summary>
        public string Busqueda
        {
            get { return _busqueda; }
            set
            {
                _busqueda = value;
                RaisePropertyChanged("Busqueda");
            }
        }

        /// <summary>
        /// Propiedad que muestra la lista de Tarjetaes
        /// </summary>
        public List<Tarjeta> ListaTarjeta
        {
            get { return _listaTarjeta; }
            set
            {
                _listaTarjeta = value;
                RaisePropertyChanged("ListaTarjeta");
            }
        }

        /// <summary>
        /// Usuario Logueado en el Sistema
        /// </summary>
        public Usuario UsuarioLogueado
        {
            get { return _usuarioLogueado; }
            set
            {
                _usuarioLogueado = value;
                RaisePropertyChanged("UsuarioLogueado");
            }
        }
        
        

        /// <summary>
        /// Item selecionado en la grilla
        /// </summary>
        public Tarjeta TarjetaItem
        {
            get { return _TarjetaItem; }
            set { _TarjetaItem = value; }
        }

       

        /// <summary>
        /// Comando para crear un nuevo item
        /// </summary>
        public RelayCommand ComandoAbrirNuevo
        {
            get
            {
                if (_comandoAbrirNuevo == null)
                {
                    _comandoAbrirNuevo = new RelayCommand
                    (
                        p => AbrirNuevo()
                    );
                }
                return _comandoAbrirNuevo;
            }
        }
        #endregion

        #region metodos Privados

        private void BuscarAsignados()
        {
            Procesando = true;
            if (ListaTemporal == null)
            {
                ListaTemporal = ListaTarjeta;
            }
          

            ListaTarjeta = ListaTemporal.Where(t => t.Estado == "ASIGNADO").ToList();
            Procesando = false;
        }

        private void BuscarEliminados()
        {
            Procesando = true;
            if (ListaTemporal == null)
            {
                ListaTemporal = ListaTarjeta;
            }

            ListaTarjeta = ListaTemporal.Where(t => t.Estado == "ELIMINADO").ToList();
            Procesando = false;
        }

        private void BuscarDisponibles()
        {
            Procesando = true;
            if (ListaTemporal == null)
            {
                ListaTemporal = ListaTarjeta;
            }
            ListaTarjeta = ListaTemporal.Where(t => t.Estado == "DISPONIBLE").ToList();
            Procesando = false;
        }



        /// <summary>
        /// Realiza la Búsqueda de Empleados
        /// </summary>
        private void Buscar()
        {

            BiciqContexto.Tarjetas.Clear();

            var datos = BiciqContexto.Tarjetas;
            if (Busqueda != null && Busqueda != "")
            {
                if (!_mostrarErrores)
                {
                    InicializarMensajesError();
                }

                BiciqContexto.Load(BiciqContexto.GetBusquedaTarjetaCodigoQuery(Busqueda)).Completed += delegate
                {
                    ListaTarjeta = datos.Where(t=>t.Tipo=="Tag").ToList();
                    NumeroAsignados = "Tags Asignados: " + ListaTarjeta.Where(t => t.Estado == "ASIGNADO").Count().ToString();
                    NumeroDisponibles = "Tags Disponibles: " +  ListaTarjeta.Where(t => t.Estado == "DISPONIBLE").Count().ToString();
                    NumeroEliminados = "Tags Eliminados: " + ListaTarjeta.Where(t => t.Estado == "ELIMINADO").Count().ToString();
                    ListaTemporal = null;
                    Busqueda = "";
                    validaBusqueda(ListaTarjeta);                   
                };
            }
            else
            {
                BiciqContexto.Load(BiciqContexto.GetTarjetasQuery()).Completed += delegate
                {
                    ListaTarjeta = datos.Where(t => t.Tipo == "Tag").ToList();
                    NumeroAsignados = "Tags Asignadas: " + ListaTarjeta.Where(t => t.Estado == "ASIGNADO").Count().ToString();
                    NumeroDisponibles = "Tags Disponibles: " + ListaTarjeta.Where(t => t.Estado == "DISPONIBLE").Count().ToString();
                    NumeroEliminados = "Tags Eliminadas: " + ListaTarjeta.Where(t => t.Estado == "ELIMINADO").Count().ToString();
                    ListaTemporal = null;
                    Busqueda = "";
                    validaBusqueda(ListaTarjeta);                   
                };
            }

           
        }
      
        
       
        
        /// <summary>
        /// Método en el cual se crea un nuevo item
        /// </summary>
        private void AbrirNuevo()
        {
            _editarTarjetaVistaModelo = new EditarTarjetaVistaModelo(ListaTarjeta,"Tag");
            _editarTarjetaVista = new EditarTarjetaVista();
            InstanciaEditarTarjeta(_TarjetaActual);
        }

        /// <summary>
        /// Para editar los Tarjetaes
        /// </summary>
        /// <param name="Tarjeta"></param>
        private void InstanciaEditarTarjeta(Tarjeta Tarjeta)
        {
            _editarTarjetaVista = new EditarTarjetaVista();
            _editarTarjetaVistaModelo = new EditarTarjetaVistaModelo(ListaTarjeta, "Tag");
           


            _editarTarjetaVistaModelo.EventoCerrarEditor += delegate
            {
                _editarTarjetaVista.Close();
                BiciqContexto.Tarjetas.Clear();
                _comandoBuscar = null;
                ComandoBuscar.Execute(true);

            };

            _editarTarjetaVista.DataContext = _editarTarjetaVistaModelo;
            _editarTarjetaVista.HasCloseButton = false;
            _editarTarjetaVista.Show();
        }

        public override void Eliminar(object parametro)
        {
            String titulo = RecursosLenguaje.Recursos.EliminarRoTitulo;
            Action accion = EliminarTarjeta;
            this.TarjetaItem = (Tarjeta)parametro;
            LogicStudio.Framework.UI.Controles.CuadroDialogo.Mostrar
                ("Está seguro de dar de baja el Tag seleccionado?", "Eliminar Tag", LogicStudio.Framework.UI.Utilidades.TipoVentana.Confirmar, accion);

        }

        private void EliminarTarjeta()
        {
            InicializarMensajesError();

            if (TarjetaItem.Estado == "ASIGNADO")
            {

                String titulo = RecursosLenguaje.Recursos.EliminarRoTitulo;
                Action accion = EliminarTarjeta;

                LogicStudio.Framework.UI.Controles.CuadroDialogo.Mostrar("El tag seleccionado se encuentra ASIGNADO, la asignación se  perderá y se deberá asignar un nuevo Tag, desea continuar?", "Eliminar Tag", LogicStudio.Framework.UI.Utilidades.TipoVentana.Confirmar, accion);

            }
            if (TarjetaItem.Estado == "ELIMINADO")
            {
              
                LogicStudio.Framework.UI.Controles.CuadroDialogo.Mostrar("El Tag ya se encuentra ELIMINADO", "Eliminar Tag", LogicStudio.Framework.UI.Utilidades.TipoVentana.Error);
                return;
            }

            if (TarjetaItem.Estado == "DISPONIBLE")
            {
                DarDebaja();
            }
        }


        private void DarDebaja()
        {
            _bajaTarjetaVista = new BajaTarjetaVista();
            _bajaTarjetaVistaModelo = new BajaTarjetaVistaModelo(TarjetaItem);

            _bajaTarjetaVistaModelo.EventoCerrarEditor += delegate
            {
                _bajaTarjetaVista.Close();
                BiciqContexto.Tarjetas.Clear();
                _comandoBuscar = null;
                ComandoBuscar.Execute(true);

            };

            _bajaTarjetaVista.DataContext = _bajaTarjetaVistaModelo;
            _bajaTarjetaVista.HasCloseButton = false;
            _bajaTarjetaVista.Show();
        }
        #endregion

    }
}
